package cn.design.clone;

/**
 * @author dlq
 * @description 深克隆： 对于要克隆的对象, 类对象中 的属性 , 引用一定要实现接口 Cloneable
 *                  1.  不管是基本类型还是引用类型,对所有可变(没有被final修饰的引用变量)引用类型的成员变量都开辟新的内存空间，
 *                  2.  引用类型和基本类型的引用和原对象的引用都不一样
 *                  3.  基于上面原因所以深克隆特别耗时
 * @date 2020/9/14 13:55
 * @since 1.0
 */
public class DeepCloneClone {
    public static void main(String[] args) {

        UserTwo user = new UserTwo();
        user.setId(1);
        user.setName("aaa");
        user.setStudent(new Student(999, "student"));
        UserTwo userClone = (UserTwo) user.clone();

        System.out.println("初始化User: " + user);
        System.out.println("克隆User: " + userClone);

        System.out.println(user.getStudent() == userClone.getStudent());

        System.out.println("修改值======================");//false

        //将基本类型值进行修改
        user.setId(55);
        //讲引用类型的值进行修改
        user.getStudent().setId(1000);

        System.out.println("初始化User修改值后: " + user);//UserTwo{id=55, name='aaa', student=Student{id=1000, name='student'}}
        //注意 User中的id，和student中的id
        System.out.println("克隆User(User修改值后): " + userClone);//UserTwo{id=1, name='aaa', student=Student{id=999, name='student'}}

    }
}
